package com.drerp.RH.carreira;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Random;

import com.drerp.RH.Cargo;
import com.drerp.RH.Colaborador;
import com.drerp.RH.HorasTrabalho;
import com.drerp.RH.DAO.CargoDAO;
import com.drerp.RH.DAO.ColaboradorDAO;
import com.drerp.RH.carreira.DAO.MetricaDAO;
import com.drerp.RH.carreira.constantes.TiposRegraPlanoCarreira;
import com.drerp.RH.carreira.constantes.UnidadesMetrica;
import com.drerp.integracao.service.Medico;
import com.drerp.integracao.service.MedicosService;

public class CarreiraTeste {

	public static void main(String[] args) {
		
		MedicosService ms = new MedicosService();
		for (Medico m : ms.getMedicos()){
			System.out.println(m.getNome());
		}
		
		/*Colaborador colab = Colaborador.encontraTodosColaboradores().get(0);
		if (colab.getCargo() == null) {
			Cargo cargo = Cargo.encontraTodosCargos().get(0);
			colab.setCargo(cargo);
			System.out.println(cargo.getNome());
		}
		System.out.println(colab.calcularSalario());*/
		
		
		/*Colaborador colab = Colaborador.encontraTodosColaboradores().get(0);
		Calendar inicio = new GregorianCalendar(2009, 1, 1, 10, 0);
		Calendar fim = new GregorianCalendar(2009, 1, 1, 19, 0);
		
		Random rand = new Random(inicio.getTimeInMillis());
		
		for (int i = 0; i < 100; i++) {
			colab.addHorasTrabalhadas(new HorasTrabalho(inicio, fim));
			
			inicio.add(Calendar.DAY_OF_MONTH, 1);
			inicio.set(Calendar.MINUTE, rand.nextInt(60));
			inicio.set(Calendar.SECOND, rand.nextInt(60));
			inicio.set(Calendar.HOUR_OF_DAY, rand.nextInt(3)+8);
			
			fim.add(Calendar.DAY_OF_MONTH, 1);
			fim.set(Calendar.MINUTE, rand.nextInt(60));
			fim.set(Calendar.SECOND, rand.nextInt(60));
			fim.set(Calendar.HOUR_OF_DAY, rand.nextInt(3)+18);
		}
		
		System.out.println(">> Horas trabalhadas: " + colab.contarHorasTrabalhadas());*/
		
		/*List<RegraPlanoCarreira> regras = RegraPlanoCarreira.getTodasRegras();
		for (RegraPlanoCarreira regra : regras) {
			if (regra.getTipo() == TiposRegraPlanoCarreira.FUNCIONARIO)
				System.out.println(regra.getColaboradorAlvo());
		}*/
		
		/*CargoDAO cargoDAO = new CargoDAO();
		Cargo medico = new Cargo("Medico", 500d);
		Cargo medico2 = new Cargo("Medico v2.0", 1000d);
		cargoDAO.save(medico);
		cargoDAO.save(medico2);
		
		ColaboradorDAO funcDAO = new ColaboradorDAO();
		Colaborador joao = new Colaborador("Joao");
		joao.setCargo(medico);
		joao.setLogin("joao");
		joao.setSenha("senha");
		funcDAO.save(joao);
		
		MetricaDAO metricaDAO = new MetricaDAO();
		Metrica tempoContrato = new Metrica("Tempo de Contrato", UnidadesMetrica.ANOS);
		Metrica horasTrabalhadas = new Metrica("Horas Trabalhadas", UnidadesMetrica.HORAS);
		Metrica consultasRealizadas = new Metrica("Consultas Realizadas", UnidadesMetrica.CONSULTAS);
		metricaDAO.save(tempoContrato);
		metricaDAO.save(horasTrabalhadas);
		metricaDAO.save(consultasRealizadas);*/
		
		/*CondicaoPlanoCarreiraDAO condDAO = new CondicaoPlanoCarreiraDAO();
		CondicaoPlanoCarreira tempoContratomaiorQue5 = new CondicaoPlanoCarreira(tempoContrato, ComparadoresMetrica.MAIOR_QUE, 5);
		CondicaoPlanoCarreira horasTrabalhadasMultiploDe1000 = new CondicaoPlanoCarreira(horasTrabalhadas, ComparadoresMetrica.MULTIPLO_DE, 1000);
		CondicaoPlanoCarreira consultasRealizadasMaiorQue100 = new CondicaoPlanoCarreira(consultasRealizadas, ComparadoresMetrica.MAIOR_QUE, 100);
		condDAO.save(consultasRealizadasMaiorQue100);
		condDAO.save(horasTrabalhadasMultiploDe1000);
		condDAO.save(tempoContratomaiorQue5);
		
		AcaoPlanoCarreiraDAO acaoDAO = new AcaoPlanoCarreiraDAO();
		AcaoPlanoCarreira soma1000 = new AcaoPlanoCarreira(TiposAcaoPlanoCarreira.SOMA, 1000);
		AcaoPlanoCarreira multiplica2 = new AcaoPlanoCarreira(TiposAcaoPlanoCarreira.MULTIPLICA, 2);
		AcaoPlanoCarreira mudaParaMedico2 = new AcaoPlanoCarreira(TiposAcaoPlanoCarreira.MUDA_CARGO, medico2);
		acaoDAO.save(soma1000);
		acaoDAO.save(multiplica2);
		acaoDAO.save(mudaParaMedico2);
		
		RegraPlanoCarreiraDAO regraDAO = new RegraPlanoCarreiraDAO();
		
		
		RegraPlanoCarreira regraGeral = new RegraPlanoCarreira(
				"Soma 1000 para todos funcionários que trabalham a mais de 5 anos", 
				TiposRegraPlanoCarreira.GERAL, 
				tempoContratomaiorQue5, 
				soma1000);
		
		RegraPlanoCarreira regraCargo = new RegraPlanoCarreira(
				"Dobra salário dos médicos a cada 1000 horas", 
				TiposRegraPlanoCarreira.CARGO,
				medico, 
				horasTrabalhadasMultiploDe1000,
				multiplica2);
		
		RegraPlanoCarreira regraFunc = new RegraPlanoCarreira(
				"Promove o João a Medico v2.0 quando ele realizar mais de 100 consultas", 
				TiposRegraPlanoCarreira.FUNCIONARIO, 
				joao, 
				consultasRealizadasMaiorQue100, 
				mudaParaMedico2);
		
		regraDAO.save(regraGeral);
		regraDAO.save(regraCargo);
		regraDAO.save(regraFunc); */
		
		
		System.out.println(">> Done");
		
		
		//System.out.println(RegraPlanoCarreira.getTodasRegras());
		/*AcaoPlanoCarreiraDAO acaoDAO = new AcaoPlanoCarreiraDAO();
		
		List<AcaoPlanoCarreira> acoes = acaoDAO.findAll(AcaoPlanoCarreira.class);
		System.out.println("Todos" + acoes);
		
		AcaoPlanoCarreira acao = acaoDAO.findById(AcaoPlanoCarreira.class, 4l);
		System.out.println("ID=4: " + acao);
		
		acoes = acaoDAO.encontrarTodosPorTipo(TiposAcaoPlanoCarreira.MUDA_CARGO);
		System.out.println("Muda cargo: " + acoes);
		
		acoes = acaoDAO.encontrarTodosPorTipo(TiposAcaoPlanoCarreira.MULTIPLICA);
		System.out.println("Multiplica: " + acoes);
		
		acoes = acaoDAO.encontrarTodosPorTipo(TiposAcaoPlanoCarreira.SOMA);
		System.out.println("Soma: " + acoes);
		
		Metrica metrica = new Metrica("Consultas realizadas", UnidadesMetrica.CONSULTAS);
		MetricaDAO metricaDAO = new MetricaDAO();
		metricaDAO.save(metrica);
		
		metrica = metricaDAO.findAll(Metrica.class).get(0);
		
		CondicaoPlanoCarreira cond = new CondicaoPlanoCarreira(metrica, ComparadoresMetrica.MAIOR_QUE, 200);
		CondicaoPlanoCarreiraDAO condDAO = new CondicaoPlanoCarreiraDAO();
		condDAO.save(cond);
		
		ColaboradorDAO funcDAO = new ColaboradorDAO();
		Colaborador func = funcDAO.findAll(Colaborador.class).get(0);
		
		RegraPlanoCarreira regra = new RegraPlanoCarreira();
		regra.setNome("Regra ABC");
		regra.setTipo(TiposRegraPlanoCarreira.FUNCIONARIO);
		regra.setCondicao(cond);
		regra.setColaboradorAlvo(func);
		regra.setAcoes(acaoDAO.findAll(AcaoPlanoCarreira.class));
		
		RegraPlanoCarreiraDAO regraDAO = new RegraPlanoCarreiraDAO();
			regraDAO.save(regra);*/
		
		
		/*
		Transaction trans = null;
		Session session = HibernateUtil.getSessionFactory().openSession();
		  
		try {
			trans = session.beginTransaction();
			
			Metrica metrica = new Metrica("Horas Trabalhadas", UnidadesMetrica.HORAS);
			session.save(metrica);
			
			CondicaoPlanoCarreira cond = new CondicaoPlanoCarreira();
			cond.setComparador(ComparadoresMetrica.MULTIPLO_DE);
			cond.setMetrica(metrica);
			cond.setValor(1000);
			session.save(cond);
			
			Colaborador func = new Colaborador("Maria");
			session.save(func);
			
			Cargo medico = new Cargo("Enfermeira Supervisora", 500d);
			session.save(medico);
			
			AcaoPlanoCarreira acao = new AcaoPlanoCarreira(TiposAcaoPlanoCarreira.SOMA, 200);
			session.save(acao);
			AcaoPlanoCarreira acao2 = new AcaoPlanoCarreira(TiposAcaoPlanoCarreira.MUDA_CARGO, medico);
			session.save(acao2);
			
			RegraPlanoCarreira regra = new RegraPlanoCarreira();
			regra.setNome("Regra 2");
			regra.setTipo(TiposRegraPlanoCarreira.FUNCIONARIO);
			regra.setCondicao(cond);
			regra.setColaboradorAlvo(func);
			regra.adicionaAcao(acao);
			regra.adicionaAcao(acao2);
			session.save(regra);
			
			trans.commit();
		} catch (RuntimeException e) {
			if (trans != null) {
				trans.rollback();
			}
			
			e.printStackTrace();
		} finally {
			session.close();
		}*/
	}
}
